/**
 *   Copyright (c) fanguangping. All rights reserved.
 *   The use and distribution terms for this software are covered by the
 *   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
 *   which can be found in the file epl-v10.html at the root of this distribution.
 *   By using this software in any fashion, you are agreeing to be bound by
 * 	 the terms of this license.
 *   You must not remove this notice, or any other, from this software.
 **/
package org.jfunny.core.sys.impl.clojure;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.jfunny.core.ds.Statement;
import org.jfunny.core.meta.Namespace;
import org.jfunny.core.sys.SysEvalable;
import org.jfunny.core.sys.SysLoader;
import org.jfunny.core.sys.SysNamespaceAware;
import org.jfunny.core.sys.SysPreparable;
import org.jfunny.core.util.StringUtil;

/**
 * 
 * @author fanguangping
 *
 */
public class SysNamespace implements SysNamespaceAware, SysPreparable, SysEvalable{

	@Override
	public Namespace getNamespace(Statement statement) {
		List<String> funcArgs = SysFunctionHelper.getArgContents(statement);
		
		String namespace = funcArgs.get(0);
		String includeTpls = funcArgs.get(1);
		String requireLibs = funcArgs.get(2);
		String useLibs = funcArgs.get(3);

		Set<Namespace> used = new HashSet<Namespace>();
		addToSet(used, includeTpls);
		addToSet(used, requireLibs);
		addToSet(used, useLibs);

		Namespace ns = new Namespace(namespace);
		ns.setTemplateSpace(false);
		ns.getUsed().addAll(used);
		return ns;
	}
	
	@Override
	public void prepare(Statement statement) {
		String namespace = SysFunctionHelper.getArgContents(statement).get(0);
		SysLoader.setCurrentNamespace(namespace);
	}
	
	@Override
	public String eval(Statement statement) {
		List<String> funcArgs = SysFunctionHelper.getArgContents(statement);
		
		String namespace = funcArgs.get(0);
		//String includeTpls = funcArgs.get(1);
		String requireLibs = funcArgs.get(2);
		String useLibs = funcArgs.get(3);

		SysLoader.setCurrentNamespace(namespace);

		StringBuffer buffer = new StringBuffer();
		buffer.append("(ns ");
		buffer.append(namespace);
		if (StringUtil.isNotBlank(requireLibs)) {
			buffer.append(" (:require ");
			buffer.append(requireLibs);
			buffer.append(")");
		}
		if (StringUtil.isNotBlank(useLibs)) {
			buffer.append(" (:use ");
			buffer.append(useLibs);
			buffer.append(")");
		}
		buffer.append(")");

		return buffer.toString();
	}
	
	private static void addToSet(Set<Namespace> set, String namespaces) {
		if (StringUtil.isNotBlank(namespaces)) {
			for (String namespace : StringUtil.split(namespaces)) {
				set.add(new Namespace(namespace));
			}
		}
	}
}
